home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / property / pagealarm.c < prev    next >
C/C++ Source or Header  |  2004-06-30  |  15KB  |  547 lines

  1. /*-------------------------------------------------------------
  2.   pagealarm.c : "Alarm" page of properties
  3.   (C) Kazuto Sato 1997-2003
  4.   For the license, please read readme.txt.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tcprop.h"
  10.  
  11. /* Globals */
  12.  
  13. BOOL CALLBACK PageAlarmProc(HWND hDlg, UINT message,
  14.     WPARAM wParam, LPARAM lParam);
  15.  
  16. /* Statics */
  17.  
  18. static void SendPSChanged(HWND hDlg);
  19. static void OnInit(HWND hDlg);
  20. static void OnApply(HWND hDlg);
  21. static void OnDestroy(HWND hDlg);
  22. static void OnName(HWND hDlg);
  23. static void OnNameDropDown(HWND hDlg);
  24. static void OnAdd(HWND hDlg);
  25. static void OnDelete(HWND hDlg);
  26. static void OnEnableAlarm(HWND hDlg);
  27. static void OnDay(HWND hDlg);
  28. static void OnBrowse(HWND hDlg);
  29. static void OnFileChange(HWND hDlg);
  30. static void OnTest(HWND hDlg, WORD id);
  31. static void OnInterval(HWND hDlg);
  32. static void EnableAlarmPageItems(HWND hDlg);
  33. static void GetAlarmFromDlg(HWND hDlg, PALARMSTRUCT pAS);
  34. static void SetAlarmToDlg(HWND hDlg, PALARMSTRUCT pAS);
  35.  
  36. static BOOL  m_bInit = FALSE;
  37. static BOOL  m_bChanged = FALSE;
  38.  
  39. static PALARMSTRUCT m_pAlarm = NULL;
  40. static int m_numAlarm = 0;
  41. static int m_nCurrent = -1;
  42. static BOOL m_bPlaying = FALSE;
  43.  
  44. /*------------------------------------------------
  45.   Dialog procedure
  46. --------------------------------------------------*/
  47. BOOL CALLBACK PageAlarmProc(HWND hDlg, UINT message,
  48.     WPARAM wParam, LPARAM lParam)
  49. {
  50.     switch(message)
  51.     {
  52.         case WM_INITDIALOG:
  53.             OnInit(hDlg);
  54.             return TRUE;
  55.         case WM_COMMAND:
  56.         {
  57.             WORD id, code;
  58.             id = LOWORD(wParam); code = HIWORD(wParam);
  59.             switch(id)
  60.             {
  61.                 case IDC_COMBOALARM:
  62.                     if(code == CBN_SELCHANGE)
  63.                     {
  64.                         m_bInit = FALSE;
  65.                         OnName(hDlg);
  66.                         m_bInit = TRUE;
  67.                     }
  68.                     else if(code == CBN_DROPDOWN)
  69.                         OnNameDropDown(hDlg);
  70.                     else if(code == CBN_EDITCHANGE)
  71.                         SendPSChanged(hDlg);
  72.                     break;
  73.                 case IDC_ADDALARM:
  74.                     OnAdd(hDlg);
  75.                     break;
  76.                 case IDC_DELALARM:
  77.                     OnDelete(hDlg);
  78.                     break;
  79.                 case IDC_ENABLEALARM:
  80.                     OnEnableAlarm(hDlg);
  81.                     SendPSChanged(hDlg);
  82.                     break;
  83.                 case IDC_HOURALARM:
  84.                 case IDC_MINUTEALARM:
  85.                 case IDC_SECONDALARM:
  86.                 case IDC_WDAYALARM:
  87.                 case IDC_ALARMINTERVALMIN:
  88.                     if(code == EN_CHANGE)
  89.                         SendPSChanged(hDlg);
  90.                     break;
  91.                 case IDC_SANSHOWDAY:
  92.                     OnDay(hDlg);
  93.                     break;
  94.                 case IDC_FILEALARM:
  95.                     if(code == EN_CHANGE)
  96.                     {
  97.                         OnFileChange(hDlg);
  98.                         SendPSChanged(hDlg);
  99.                     }
  100.                     break;
  101.                 case IDC_SANSHOALARM:
  102.                     OnBrowse(hDlg);
  103.                     OnFileChange(hDlg);
  104.                     SendPSChanged(hDlg);
  105.                     break;
  106.                 case IDC_12HOURALARM:
  107.                 case IDC_REPEATALARM:
  108.                 case IDC_BLINKALARM:
  109.                 case IDC_ALARMBOOTEXEC:
  110.                     SendPSChanged(hDlg);
  111.                     break;
  112.                 case IDC_TESTALARM:
  113.                     OnTest(hDlg, id);
  114.                     break;
  115.                 case IDC_ALARMINTERVAL:
  116.                     OnInterval(hDlg);
  117.                     SendPSChanged(hDlg);
  118.                     break;
  119.             }
  120.             return TRUE;
  121.         }
  122.         case WM_NOTIFY:
  123.             switch(((NMHDR *)lParam)->code)
  124.             {
  125.                 case PSN_APPLY: OnApply(hDlg); break;
  126.                 case PSN_HELP: MyHelp(GetParent(hDlg), "Alarm"); break;
  127.             }
  128.             return TRUE;
  129.         case WM_DESTROY:
  130.             OnDestroy(hDlg);
  131.             break;
  132.         // playing sound ended
  133.         case MM_MCINOTIFY:
  134.         case MM_WOM_DONE:
  135.             if(message == MM_MCINOTIFY)
  136.                 OnMCINotify(hDlg, wParam, (LONG)lParam);
  137.             else
  138.                 StopFile();
  139.             m_bPlaying = FALSE;
  140.             SendDlgItemMessage(hDlg, IDC_TESTALARM,
  141.                 BM_SETIMAGE, IMAGE_ICON, (LPARAM)g_hIconPlay);
  142.             return TRUE;
  143.     }
  144.     return FALSE;
  145. }
  146.  
  147. /*------------------------------------------------
  148.   notify parent window to enable "Apply" button
  149. --------------------------------------------------*/
  150. void SendPSChanged(HWND hDlg)
  151. {
  152.     if(m_bInit)
  153.     {
  154.         g_bApplyMain = TRUE;
  155.         m_bChanged = TRUE;
  156.         SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)(hDlg), 0);
  157.     }
  158. }
  159.  
  160. /*------------------------------------------------
  161.   initialize
  162. --------------------------------------------------*/
  163. void OnInit(HWND hDlg)
  164. {
  165.     int i;
  166.     
  167.     m_bInit = FALSE;
  168.     
  169.     // common/tclang.c
  170.     SetDialogLanguage(hDlg, "Alarm", g_hfontDialog);
  171.     
  172.     m_numAlarm = GetMyRegLong("", "AlarmNum", 0);
  173.     if(m_numAlarm < 1) m_numAlarm = 0;
  174.     
  175.     if(m_numAlarm > 0)
  176.     {
  177.         m_pAlarm = malloc(sizeof(ALARMSTRUCT) * m_numAlarm);
  178.         LoadAlarm(m_pAlarm, m_numAlarm); // common/alarmstruct.c
  179.     }
  180.     else // no alarm
  181.     {
  182.         PALARMSTRUCT pAS;
  183.         
  184.         m_numAlarm = 1;
  185.         m_pAlarm = malloc(sizeof(ALARMSTRUCT));
  186.         
  187.         pAS = m_pAlarm;
  188.         memset(pAS, 0, sizeof(ALARMSTRUCT));
  189.         strcpy(pAS->name, "Alarm1");
  190.         pAS->bEnable = TRUE;
  191.     }
  192.     
  193.     for(i = 0; i < m_numAlarm; i++)
  194.          CBAddString(hDlg, IDC_COMBOALARM, (LPARAM)(m_pAlarm+i)->name);
  195.     
  196.     CBSetCurSel(hDlg, IDC_COMBOALARM, 0);
  197.     OnName(hDlg);
  198.     
  199.     SendDlgItemMessage(hDlg, IDC_TESTALARM, BM_SETIMAGE, IMAGE_ICON,
  200.         (LPARAM)g_hIconPlay);
  201.     
  202.     m_bPlaying = FALSE;
  203.     
  204.     m_bInit = TRUE;
  205. }
  206.  
  207. /*------------------------------------------------
  208.    apply - save settings
  209. --------------------------------------------------*/
  210. void OnApply(HWND hDlg)
  211. {
  212.     int i, nOldAlarm;
  213.     
  214.     if(!m_bChanged) return;
  215.     m_bChanged = FALSE;
  216.     
  217.     OnNameDropDown(hDlg);
  218.     
  219.     if(m_pAlarm && (0 <= m_nCurrent && m_nCurrent < m_numAlarm))
  220.         GetAlarmFromDlg(hDlg, (m_pAlarm + m_nCurrent));
  221.     
  222.     nOldAlarm = GetMyRegLong("", "AlarmNum", 0);
  223.     if(nOldAlarm < 1) nOldAlarm = 0;
  224.     
  225.     SetMyRegLong("", "AlarmNum", m_numAlarm);
  226.     
  227.     if(m_pAlarm)
  228.         SaveAlarm(m_pAlarm, m_numAlarm); // common/alarmstruct.c
  229.     
  230.     for(i = m_numAlarm; i < nOldAlarm; i++)
  231.     {
  232.         char subkey[20];
  233.         wsprintf(subkey, "Alarm%d", i + 1);
  234.         DelMyRegKey(subkey);
  235.     }
  236. }
  237.  
  238. /*------------------------------------------------
  239.   free memories associated with combo box.
  240. --------------------------------------------------*/
  241. void OnDestroy(HWND hDlg)
  242. {
  243.     if(m_bPlaying) StopFile(); m_bPlaying = FALSE;
  244.     
  245.     if(m_pAlarm) free(m_pAlarm);
  246. }
  247.  
  248. /*------------------------------------------------
  249.    an alarm name is selected by combobox
  250. --------------------------------------------------*/
  251. void OnName(HWND hDlg)
  252. {
  253.     int index;
  254.     
  255.     if(m_pAlarm && 0 <= m_nCurrent && m_nCurrent < m_numAlarm)
  256.         GetAlarmFromDlg(hDlg, m_pAlarm + m_nCurrent);
  257.     
  258.     index = CBGetCurSel(hDlg, IDC_COMBOALARM);
  259.     
  260.     if(m_pAlarm && 0 <= index && index < m_numAlarm)
  261.     {
  262.         SetAlarmToDlg(hDlg, m_pAlarm + index);
  263.         m_nCurrent = index;
  264.     }
  265. }
  266.  
  267. /*------------------------------------------------
  268.    combo box is about to be visible
  269.    set edited text to combo box
  270. --------------------------------------------------*/
  271. void OnNameDropDown(HWND hDlg)
  272. {
  273.     char name[BUFSIZE_NAME];
  274.     
  275.     if(!m_pAlarm || !(0 <= m_nCurrent && m_nCurrent < m_numAlarm)) return;
  276.     
  277.     GetDlgItemText(hDlg, IDC_COMBOALARM, name, BUFSIZE_NAME);
  278.     
  279.     if(strcmp(name, m_pAlarm[m_nCurrent].name) != 0)
  280.     {
  281.         CBDeleteString(hDlg, IDC_COMBOALARM, m_nCurrent);
  282.         CBInsertString(hDlg, IDC_COMBOALARM, m_nCurrent, name);
  283.         strcpy(m_pAlarm[m_nCurrent].name, name);
  284.     }
  285. }
  286.  
  287. /*------------------------------------------------
  288.   add an alarm
  289. --------------------------------------------------*/
  290. void OnAdd(HWND hDlg)
  291. {
  292.     PALARMSTRUCT pASNew, pAS;
  293.     int i;
  294.     
  295.     OnNameDropDown(hDlg);
  296.     
  297.     if(m_pAlarm && (0 <= m_nCurrent && m_nCurrent < m_numAlarm))
  298.         GetAlarmFromDlg(hDlg, (m_pAlarm + m_nCurrent));
  299.     
  300.     pASNew = malloc(sizeof(ALARMSTRUCT)*(m_numAlarm+1));
  301.     for(i = 0; i < m_numAlarm && m_pAlarm; i++)
  302.         memcpy(pASNew + i, m_pAlarm + i, sizeof(ALARMSTRUCT));
  303.     
  304.     pAS = pASNew + i;
  305.     memset(pAS, 0, sizeof(ALARMSTRUCT));
  306.     wsprintf(pAS->name, "Alarm%d", i+1);
  307.     pAS->bEnable = TRUE;
  308.     
  309.     CBAddString(hDlg, IDC_COMBOALARM, (LPARAM)pAS->name);
  310.     CBSetCurSel(hDlg, IDC_COMBOALARM, i);
  311.     m_nCurrent = i;
  312.     
  313.     m_numAlarm++;
  314.     if(m_pAlarm) free(m_pAlarm);
  315.     m_pAlarm = pASNew;
  316.     
  317.     if(m_numAlarm == 1)
  318.         EnableAlarmPageItems(hDlg);
  319.     
  320.     SetAlarmToDlg(hDlg, pAS);
  321.     
  322.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  323. }
  324.  
  325. /*------------------------------------------------
  326.   delete an alarm
  327. --------------------------------------------------*/
  328. void OnDelete(HWND hDlg)
  329. {
  330.     PALARMSTRUCT pASNew;
  331.     int i, j;
  332.     
  333.     if(!m_pAlarm || m_numAlarm < 1) return;
  334.     if(!(0 <= m_nCurrent && m_nCurrent < m_numAlarm)) return;
  335.     
  336.     if(m_numAlarm > 1)
  337.     {
  338.         pASNew = malloc(sizeof(ALARMSTRUCT)*(m_numAlarm-1));
  339.         for(i = 0, j = 0; i < m_numAlarm; i++)
  340.         {
  341.             if(i != m_nCurrent)
  342.             {
  343.                 memcpy(pASNew + j, m_pAlarm + i, sizeof(ALARMSTRUCT));
  344.                 j++;
  345.             }
  346.         }
  347.         
  348.         CBDeleteString(hDlg, IDC_COMBOALARM, m_nCurrent);
  349.         
  350.         if(m_nCurrent == m_numAlarm - 1) m_nCurrent--;
  351.         CBSetCurSel(hDlg, IDC_COMBOALARM, m_nCurrent);
  352.         SetAlarmToDlg(hDlg, (pASNew + m_nCurrent));
  353.         
  354.         m_numAlarm--;
  355.         free(m_pAlarm);
  356.         m_pAlarm = pASNew;
  357.     }
  358.     else
  359.     {
  360.         free(m_pAlarm); m_pAlarm = NULL;
  361.         m_numAlarm = 0;
  362.         m_nCurrent = -1;
  363.         
  364.         CBDeleteString(hDlg, IDC_COMBOALARM, 0);
  365.         EnableAlarmPageItems(hDlg);
  366.         SetAlarmToDlg(hDlg, NULL);
  367.     }
  368.     
  369.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  370. }
  371.  
  372. /*------------------------------------------------
  373.   "Active" checkbox
  374. --------------------------------------------------*/
  375. void OnEnableAlarm(HWND hDlg)
  376. {
  377.     HWND hwnd = GetDlgItem(hDlg, IDC_ENABLEALARM);
  378.     BOOL b = IsDlgButtonChecked(hDlg, IDC_ENABLEALARM);
  379.     
  380.     hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
  381.     while(hwnd)
  382.     {
  383.         EnableWindow(hwnd, b);
  384.         hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
  385.     }
  386.     if(b) OnFileChange(hDlg);
  387. }
  388.  
  389. /*------------------------------------------------
  390.   "Day..."
  391. --------------------------------------------------*/
  392. void OnDay(HWND hDlg)
  393. {
  394.     PALARMSTRUCT pAS;
  395.     
  396.     if(!m_pAlarm || !(0 <= m_nCurrent && m_nCurrent < m_numAlarm)) return;
  397.     pAS = m_pAlarm + m_nCurrent;
  398.     GetAlarmFromDlg(hDlg, pAS);
  399.     SetAlarmTime(pAS);
  400.     
  401.     // open dialog - alarmday.c
  402.     if(SetAlarmDay(hDlg, pAS) == IDOK)
  403.     {
  404.         SetDlgItemText(hDlg, IDC_WDAYALARM, pAS->strWDays);
  405.         SendPSChanged(hDlg);
  406.     }
  407. }
  408.  
  409. /*------------------------------------------------
  410.   browse sound file
  411. --------------------------------------------------*/
  412. void OnBrowse(HWND hDlg)
  413. {
  414.     char deffile[MAX_PATH], fname[MAX_PATH];
  415.     
  416.     GetDlgItemText(hDlg, IDC_FILEALARM, deffile, MAX_PATH);
  417.     
  418.     // common/soundselect.c
  419.     if(!BrowseSoundFile(g_hInst, hDlg, deffile, fname))
  420.         return;
  421.     
  422.     SetDlgItemText(hDlg, IDC_FILEALARM, fname);
  423.     PostMessage(hDlg, WM_NEXTDLGCTL, 1, FALSE);
  424. }
  425.  
  426. /*------------------------------------------------
  427.    file name changed - enable/disable controls
  428. --------------------------------------------------*/
  429. void OnFileChange(HWND hDlg)
  430. {
  431.     char fname[MAX_PATH];
  432.     
  433.     GetDlgItemText(hDlg, IDC_FILEALARM, fname, MAX_PATH);
  434.     
  435.     EnableDlgItem(hDlg, IDC_REPEATALARM, IsSoundFile(fname));
  436. }
  437.  
  438. /*------------------------------------------------
  439.   test sound
  440. --------------------------------------------------*/
  441. void OnTest(HWND hDlg, WORD id)
  442. {
  443.     char fname[MAX_PATH];
  444.     
  445.     GetDlgItemText(hDlg, IDC_FILEALARM, fname, MAX_PATH);
  446.     if(fname[0] == 0) return;
  447.     
  448.     if((HICON)SendDlgItemMessage(hDlg, id, BM_GETIMAGE, IMAGE_ICON, 0)
  449.         == g_hIconPlay)
  450.     {
  451.         if(PlayFile(hDlg, fname, 0))
  452.         {
  453.             SendDlgItemMessage(hDlg, id, BM_SETIMAGE, IMAGE_ICON,
  454.                 (LPARAM)g_hIconStop);
  455.             InvalidateRect(GetDlgItem(hDlg, id), NULL, FALSE);
  456.             m_bPlaying = TRUE;
  457.         }
  458.     }
  459.     else
  460.     {
  461.         StopFile();
  462.         m_bPlaying = FALSE;
  463.     }
  464. }
  465.  
  466. /*------------------------------------------------
  467.   "At regular intervals" checkbox
  468. --------------------------------------------------*/
  469. void OnInterval(HWND hDlg)
  470. {
  471.     HWND hwnd = GetDlgItem(hDlg, IDC_ALARMINTERVAL);
  472.     BOOL b = IsDlgButtonChecked(hDlg, IDC_ALARMINTERVAL);
  473.     
  474.     if(!IsDlgButtonChecked(hDlg, IDC_ENABLEALARM)) b = FALSE;
  475.     
  476.     hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
  477.     EnableWindow(hwnd, b);
  478.     hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
  479.     EnableWindow(hwnd, b);
  480. }
  481.  
  482. /*------------------------------------------------
  483.   enable/disable all dialog items
  484. --------------------------------------------------*/
  485. void EnableAlarmPageItems(HWND hDlg)
  486. {
  487.     HWND hwnd;
  488.     BOOL b = (m_pAlarm != NULL);
  489.     
  490.     hwnd = GetWindow(hDlg, GW_CHILD);
  491.     while(hwnd)
  492.     {
  493.         if(GetDlgCtrlID(hwnd) != IDC_ADDALARM)
  494.             EnableWindow(hwnd, b);
  495.         
  496.         hwnd = GetWindow(hwnd, GW_HWNDNEXT);
  497.     }
  498. }
  499.  
  500. /*------------------------------------------------
  501.   get settings of an alarm from the page
  502. --------------------------------------------------*/
  503. void GetAlarmFromDlg(HWND hDlg, PALARMSTRUCT pAS)
  504. {
  505.     GetDlgItemText(hDlg, IDC_COMBOALARM, pAS->name, BUFSIZE_NAME);
  506.     pAS->bEnable = IsDlgButtonChecked(hDlg, IDC_ENABLEALARM);
  507.     
  508.     GetDlgItemText(hDlg, IDC_HOURALARM, pAS->strHours, 80);
  509.     GetDlgItemText(hDlg, IDC_MINUTEALARM, pAS->strMinutes, 80);
  510.     pAS->second = GetDlgItemInt(hDlg, IDC_SECONDALARM, NULL, FALSE);
  511.     GetDlgItemText(hDlg, IDC_WDAYALARM, pAS->strWDays, 80);
  512.     
  513.     GetDlgItemText(hDlg, IDC_FILEALARM, pAS->fname, MAX_PATH);
  514.     pAS->bHour12 = IsDlgButtonChecked(hDlg, IDC_12HOURALARM);
  515.     pAS->bRepeat = IsDlgButtonChecked(hDlg, IDC_REPEATALARM);
  516.     pAS->bBlink = IsDlgButtonChecked(hDlg, IDC_BLINKALARM);
  517.     pAS->bBootExec = IsDlgButtonChecked(hDlg, IDC_ALARMBOOTEXEC);
  518.     pAS->bInterval = IsDlgButtonChecked(hDlg, IDC_ALARMINTERVAL);
  519.     pAS->nInterval = GetDlgItemInt(hDlg, IDC_ALARMINTERVALMIN, NULL, FALSE);
  520. }
  521.  
  522. /*------------------------------------------------
  523.   set settings of an alarm to the page
  524. --------------------------------------------------*/
  525. void SetAlarmToDlg(HWND hDlg, PALARMSTRUCT pAS)
  526. {
  527.     SetDlgItemText(hDlg, IDC_COMBOALARM, pAS ? pAS->name : "");
  528.     CheckDlgButton(hDlg, IDC_ENABLEALARM, pAS ? pAS->bEnable : FALSE);
  529.     
  530.     SetDlgItemText(hDlg, IDC_HOURALARM, pAS ? pAS->strHours : "");
  531.     SetDlgItemText(hDlg, IDC_MINUTEALARM, pAS ? pAS->strMinutes : "");
  532.     if(pAS && pAS->second)
  533.         SetDlgItemInt(hDlg, IDC_SECONDALARM, pAS->second, FALSE);
  534.     else SetDlgItemText(hDlg, IDC_SECONDALARM, "");
  535.     SetDlgItemText(hDlg, IDC_WDAYALARM, pAS ? pAS->strWDays : "");
  536.     SetDlgItemText(hDlg, IDC_FILEALARM, pAS ? pAS->fname : "");
  537.     CheckDlgButton(hDlg, IDC_12HOURALARM, pAS ? pAS->bHour12 : FALSE);
  538.     CheckDlgButton(hDlg, IDC_REPEATALARM, pAS ? pAS->bRepeat : FALSE);
  539.     CheckDlgButton(hDlg, IDC_BLINKALARM,  pAS ? pAS->bBlink  : FALSE);
  540.     CheckDlgButton(hDlg, IDC_ALARMBOOTEXEC, pAS ? pAS->bBootExec : FALSE);
  541.     CheckDlgButton(hDlg, IDC_ALARMINTERVAL, pAS ? pAS->bInterval : FALSE);
  542.     SetDlgItemInt(hDlg, IDC_ALARMINTERVALMIN, pAS ? pAS->nInterval : 0, FALSE);
  543.     
  544.     OnEnableAlarm(hDlg);
  545.     OnInterval(hDlg);
  546. }
  547.